5-3 jIsPi颩蚍う瑆

JavaScript 的函數也可以支援遞迴呼叫(Recursive Calls),也就是說,一個函數可以呼叫它自己。例如,對於階乘函數來說,我們有 n! = n*(n-1)!,因此我們可以寫一個遞迴式的階乘函數,例如:

Example(funcFact.htm):

其原始檔案內容如下:

原始檔(funcFact.htm):(灰色區域按兩下即可拷貝)
<html>
<head>
<meta HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=big5">
</head>

<body>
<h2 align=center>以遞迴方式進行階乘函數的計算</h2>
<hr>

<script>
function fact(n){		// 以遞迴方式進行階乘函數的計算
	if (n==0) return(1);	// 結束條件
	return(n*fact(n-1));	// 遞迴呼叫
}

for (i=10; i<19; i++)
	document.write(i+"! = "+fact(i)+"<br>");
</script>

<hr>
</body>
</html>

Hint
遞迴式的函數雖然好用,程式碼也很簡短,但是在進行運算時,會耗掉很多 CPU 及記憶體資源,因此除非資料結構本身(例如 Tree)或應用問題本身(例如 Hanoi Tower)就適合遞迴函數的使用,否則還是盡量少用。

JavaScript 的函數可接受「可變個數的輸入引數」 (Input Arguments of Variable Length),這是因為輸入引數可存放在函數物件本身的一個欄位(或性質) arguments 之中,此欄位所存放的資料是一個陣列,JavaScript 可用其 arguments.length 得知真正的引數個數。例如,我們可寫一個函數,來將輸入引數以無序列表或有序列表的方式顯示,此函數的原始碼如下:

原始檔(list.js):(灰色區域按兩下即可拷貝)
// 可變引數個數的函式範例
function list(type) {
	document.write("<" + type + "l>");
	for (var i=1; i<list.arguments.length; i++)
		document.write("<li>" + list.arguments[i]);
	document.write("</" + type + "l>");
}

在上述函數中,type 是第一個引數(可以是 "o" 或是 "u"),而後續的其他輸入引數,則是以 list.arguments 這個陣列來表示,其中 list 是函數的名稱。例如,list.arguments[0] 就是 type 本身,list.arguments[1] 就是在 type 之後的第一個引數,list.arguments[2] 則是第二個,依此類推。

使用上述函數可產生任意個數的無序和有序列表,如下:

Example(list01.htm):

其原始碼為:

原始檔(list01.htm):(灰色區域按兩下即可拷貝)
<html>
<head>
<meta HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=big5">
</head>

<body>
<h2 align=center>可接受不同輸入個數的函數</h2>
<hr>

<script src="list.js"></script>

以「list("u", "香蕉", "橘子", "蘋果")」產生的無序列表:
<script>
list("u", "香蕉", "橘子", "蘋果");
</script>

以「list("o", "冠軍", "亞軍", "季軍", "墊底")」產生的有序列表:
<script>
list("o", "冠軍", "亞軍", "季軍", "墊底");
</script>

<hr>
</body>
</html>


JavaScript 程式設計與應用:用於網頁用戶端